#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LEN 1024
/* 每次只读一行 */
int read_line(char * buffer, int max_len, FILE *fp)
{
    char temp;
    int i;
    int ret;
    for(i = 0; i < max_len; i++)
    {
        if((ret = read(&temp, 1, 1,fp)) < 0)
        {
            perror("read data error!");
            return -1;
        }
        if(ret == 0)            //读到文件末尾
        {
            buffer[i] = '\0';
            return 0;
        }
        if(temp == '\n')        //读到斜杠n停止
        {
            buffer[i] = temp;
            break;
        }
        buffer[i] = temp;
    }
    buffer[i + 1] = '\0';

    return i + 1;   //返回的需要读取的字节数  i+１解决遇到换行就停止的问题
}

//临时文件可以用W
int main(int argc, char ** argv)
{
    if(argc != 2)
    {
        printf("Please input filename\n");
    }

    FILE * fp = NULL;           //操作fp相当于在操作fp所指向的文件
/* 定义一个缓冲区 */
    char buffer[MAX_LEN];
/* 打开文件 */
    fp = fopen(argv[1], "a+");          //mode可以自己定义，使用argv在运行时候就可以自定义打开的文件名
    if(fp == NULL)
    {
        printf(" open file error:%s\n",argv[1]);
        perror("open file error");      //会打印出错误原因
        exit(1);                        //exit(0)则是返回0。exit(0)表示程序正常退出，非0表示非正常退出,返回主调程序。
    }
/* 打印三行文件内容 */
    for(int i = 0; i < 3; i++)
    {
        memset(buffer, 0 , sizeof(buffer));
        gets(buffer);
        if(fwrite(buffer, 1, strlen(buffer), fp) < 0)
        {
            perror("open file error");      
            exit(1);
        }
        fwrite("\n", 1, 1, fp);
    }
/* 计算文件大小 */
    // fseek(fp, 0, SEEK_END);
    // int filesize = ftell(fp);
    // printf("file size = %d\n", filesize);
/* 写文件 */
    //fwrite
    /* 清空buffer */
    memset(buffer, 0 , sizeof(buffer));             //（str， int c， n）将str的n个字节设置为c
    memcpy(buffer, "hello world", 11);              //（dest，str，n）将n个字节的str拷贝给buffer
    int w_len = fwrite(buffer, 1, strlen(buffer), fp);  
    if(w_len < 0)
    {
        perror("write data error\n");
        exit(1);                                    //异常处理，一定要做
    }

    // if(fseek(fp, 0, SEEK_SET) != 0)
    // {
    //     perror("seek fp error!");
    //     exit(1);
    // }
    // int filelen = ftell(fp);
    // fseek(fp, -filelen, SEEK_CUR);
    // rewind(fp);
    // fseek(fp, 0, SEEK_END);

/* 读取文件 */
    //fread
    /*第一种方法*/
    memset(buffer, 0 , sizeof(buffer));         //先把buffer清空
    int r_len = fread(buffer, 1, w_len, fp);    //从fp读取到buffer
    if(r_len < 0)
    {
        perror("read data error");
        exit(1);
    }
    printf("r_len = %d\n", r_len);
    printf("read data:%s\n, buffer");
    /*第二种方法*/
    rewind(fp);
    memset(buffer, 0 , sizeof(buffer));

    while(read_line(buffer, MAX_LEN, fp) != 0)      /* 读到文件结束停止 */
    {
        printf("%s", buffer);
        memset(buffer, 0, sizeof(buffer));
    }

    while(!feof)        //当后面还有值，feof返回0，没有值返回非0
    {
        memset(buffer, 0, sizeof(buffer));
        read_line(buffer, MAX_LEN, fp);
        printf("%s", buffer);
    }




    fclose(fp);     //打开文件都要关闭,把指针释放，不然会内存泄漏
    return 0;

}